#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<time.h>
#include<sys/select.h>

/*对标准输入进行可读事件监控，有数据则读取，没有数据则阻塞*/

int main()
{
  fd_set rfds;    //定义可读事件集合
  while(1){
     int maxfd=0;    //集合中最大描述符个数 --- 因为只对标准输入进行可读事件监控，因此最大描述符 1 个
     struct timeval tv;    //定义时间结构体
     tv.tv_sec=3;
     tv.tv_usec=0;

     FD_ZERO(&rfds);    //初始化集合
     FD_SET(0,&rfds); //将标准输入-0，添加到可读集合

     int nfds=select(maxfd+1,&rfds,NULL,NULL,&tv);   //开始监控，只有可读集合 rfds 
     if(nfds<0){
        perror("select error~!\n");
        return -1;
     }else if(nfds==0){
        perror("select timeout!\n");        //等待超时
        continue;
     }
 
     //for 循环遍历集合
     for(int i=0;i<=maxfd;++i){
         if(FD_ISSET(i,&rfds)!=0){
             //判断 i 号描述符在可读集合中，说明就绪了可读事件
             char buf[1024]={0};
             read(i,buf,1024);          //从 i 号描述符中读取数据放入 buf
             printf("buf:[%s]\n",buf);
         }
         //else if(FD_ISSET(i,&efds))  {
               //判断 i 号描述符在可写事件中，说明就绪了可写事件
         //}
     }
  }
  return 0;
}
